package com.alibaba.algo.dao.user;

import com.alibaba.algo.cooperation.feign.vo.req.SelectOrgUserEmployeeVO;
import com.alibaba.algo.cooperation.feign.vo.req.SelectParentOrgReqVO;
import com.alibaba.algo.cooperation.feign.vo.req.SelectRoleUserReqVO;
import com.alibaba.algo.core.base.BaseMapper;
import com.alibaba.algo.dtos.user.SysOrgDTO;
import com.alibaba.algo.entity.user.SysOrg;
import com.alibaba.algo.entity.user.SysUser;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 类SysOrgMapper.java的实现描述：组织机构Mapper
 *
 * @author nieganggang 2021-03-12 16:08:17
 */
public interface SysOrgMapper extends BaseMapper<SysOrg> {

    /**
     * 根据组织名称查询组织详情
     *
     * @param orgName 组织名称
     * @return 组织详情
     */
    SysOrg qryOrgByOrgName(@Param("orgName") String orgName);

    /**
     * 查询当前组织及所有下级组织的组织列表（仅包含id）
     *
     * @param orgId   组织标识
     * @return 组织列表
     */
    List<Long> qryOrgIdListByOrgId(@Param("orgId") String orgId);


    /**
     * 查询当前组织及所有下级组织
     * @param orgId
     * @return
     */
    List<SysOrg> qryChildListByOrgId(@Param("orgId") String orgId);

    /**
     * 查询组织下的用户列表
     *
     * @param orgId 组织标识
     * @return 用户列表
     */
    List<SysUser> selectUserListByOrgId(@Param("orgId") Long orgId,@Param("isDeleted") String isDeleted);


    /**
     * 根据用户模糊条件及组织id查询组织下的用户列表
     *
     * @param orgId 组织标识
     * @param searchKey 模糊匹配条件
     * @return 用户列表
     */
    List<SysUser> selectUserListByOrgIdAndSearchKey(@Param("orgId") Long orgId, @Param("searchKey") String searchKey, @Param("isDeleted") String isDeleted);

    /**
     * 根据组织编码查询组织详情
     *
     * @param orgCode 组织编码
     * @return 组织详情
     */
    SysOrg qryOrgByOrgCode(@Param("orgCode") String orgCode);

    List<SysOrg> qryOrgListByOrgCode(@Param("orgCode") String orgCode);

    List<SysOrg> qryOrgListByIdsAndCodes(@Param("obj") SelectRoleUserReqVO obj);

    /**
     * 根据id物理删除组织
     * @param id
     * @return
     */
    int deleteOrgById(@Param("id") Long id);

    List<Long> selectOrgIdListRecursiveToRootCorrelateGroup(@Param("id") Long id);

    List<SysOrg> selectOrgIdListRecursiveToRoot(@Param("id") Long id);

    List<SysOrgDTO> selectOrgByEmployeeCondition(@Param("obj") SelectOrgUserEmployeeVO vo);

    List<SysOrgDTO> selectOrgListByEmployeeCodesAndOrgIds(@Param("list1") List<String> employeeCodeList,@Param("list2") List<Long> orgIds,@Param("matchFlag") Integer matchFlag);

    List<SysOrgDTO> selectOrgByEmployeePreciseCondition(@Param("obj") SelectOrgUserEmployeeVO vo);

    List<SysOrgDTO> selectOrgByEmployeeAndOrgRangeCondition(@Param("obj") SelectOrgUserEmployeeVO vo);

    List<SysOrgDTO> selectOrgByOrgCondition(@Param("obj") SelectOrgUserEmployeeVO vo);

    SysOrg selectOneByCondition(@Param("obj") SysOrg org);

    Integer deleteById(@Param("orgId") Long orgId);

    List<SysOrg> qryOrgListByParentIdAndDepartment(@Param("obj") SelectParentOrgReqVO selectParentOrgReqVO);

    List<SysOrg> listByParaWithIsDeleted(@Param("obj") SysOrg obj, @Param("sort") String sort);
}
